package progetto.socialnetwork;
import grafi.Arco;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import progetto.common.GrafoSocialNetwork;


public class GrafoTwitter extends GrafoSocialNetwork{
	private Loader loader;
	
	/** Costruttore che carica i dati da file*/
	public GrafoTwitter(int n, boolean b){
		super(n);
		
	}
	
	/** Costruttore che carica i dati da web*/		
	public GrafoTwitter(int n) {	
		this(n,1);
	}
	
	/** Costruttore che carica i dati da web*/
	public GrafoTwitter(int n, int seme) {
		super(n);
		long in=System.currentTimeMillis();
		loader=new Loader();
		Dati d=new Dati();
		loader.queryRimanenti();
		loader.caricaDatiDaTwitter(d, n, seme);
		d.stampaSize();
		loader.caricaSolamenteArchi(d);
		d.stampaSize();
		d.salva();
		popolaDaDati(d);		
		System.out.println("Tempo totale per l'intera procedura "+Loader.timeToString(System.currentTimeMillis() - in));
	}
	
	/** Costruttore che carica i dati da file (Formato Dati)*/
	private GrafoTwitter(Dati d){
		super(d.getNodi().size());
		popolaDaDati(d);
	}
	
	public static GrafoTwitter loadData(){
		Dati d=new Dati();
		d.carica();
		return new GrafoTwitter(d);
	}
	
	private void popolaDaDati(Dati d){
		long inizio=System.currentTimeMillis();
		Set<Long> nodi=d.getNodi();
		Iterator<Long> it=nodi.iterator();
		HashMap<String, Integer>mappaIdNodi = new HashMap<String, Integer>();
		int i=0;
		while (it.hasNext()){
			long idNodoCorr=it.next();
			mappaNodiId.put(i, String.valueOf(idNodoCorr));
			mappaIdNodi.put(String.valueOf(idNodoCorr),i);
			i++;
		}
		
		HashMap<Long, HashSet<Long>> archiInEntrata=d.getArchiInEntrata();
		Iterator<Long> nodiFine=archiInEntrata.keySet().iterator();
		while (nodiFine.hasNext()){
			long fineCorr=nodiFine.next();
			Iterator<Long> nodiInizio=archiInEntrata.get(fineCorr).iterator();
			while (nodiInizio.hasNext()){
				int in=mappaIdNodi.get(String.valueOf(nodiInizio.next()));
				int fin=mappaIdNodi.get(String.valueOf(fineCorr));
				aggiungiArco(new Arco(in,fin));				
			}
		}		
		System.out.println("GrafoTwitter generato in "+(System.currentTimeMillis() - inizio)+"msec");
	}

}
